#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
#include <time.h>
#include <math.h>

#include "carte.h"


void caInit(Carte* ca, char valeur,char couleur,int numero)
{

    ca->atout = false;
    ca->valeur = valeur;
    ca->couleur = couleur;
    ca->numero = numero;


    switch (valeur)
    {
        case 55:
            ca->nb_points = 0;
            break;
        case 56:
            ca->nb_points = 0;
            break;
        case 57:
            ca->nb_points = 0;
            break;
        case 116:
            ca->nb_points = 10;
            break;
        case 118:
            ca->nb_points = 2;
            break;
        case 100:
            ca->nb_points = 3;
            break;
        case 114:
            ca->nb_points = 4;
            break;
        case 97:
            ca->nb_points = 11;
            break;
        default:
            printf("erreur");
            break;
    }

}



void caInit_Jeux_fichier(char* jeux, const char filename[])
{
    int i;

    FILE* f;

    f = fopen(filename, "r");

    if (f==NULL)
    {
        printf("Erreur lors de l'ouverture de %s\n", filename);
        assert( f );
    }

    for(i=0;i<64;i=i+2)
    {
        fscanf(f, "%c%c ", &(jeux[i]), &(jeux[i+1]));
    }

    fclose(f);

}


void caInit_Jeu(char jeux_fichier[64],Carte* jeux)
{
    int i,j;
    Carte c;
    j=1;
    for (i=0;i<64;i=i+2)
    {
        caInit(&c,jeux_fichier[i],jeux_fichier[i+1],j);
        jeux[i/2]=c;
        j=j+1;
    }
}



void caDistribution(Carte jeux_carte[32] , Carte* main_joueur1, Carte* main_joueur2,
                    Carte* main_joueur3, Carte* main_joueur4)
{
    main_joueur1[0] = jeux_carte[0];
    main_joueur1[1] = jeux_carte[1];
    main_joueur1[2] = jeux_carte[2];
    main_joueur2[0] = jeux_carte[3];
    main_joueur2[1] = jeux_carte[4];
    main_joueur2[2] = jeux_carte[5];
    main_joueur3[0] = jeux_carte[6];
    main_joueur3[1] = jeux_carte[7];
    main_joueur3[2] = jeux_carte[8];
    main_joueur4[0] = jeux_carte[9];
    main_joueur4[1] = jeux_carte[10];
    main_joueur4[2] = jeux_carte[11];
    main_joueur1[3] = jeux_carte[12];
    main_joueur1[4] = jeux_carte[13];
    main_joueur2[3] = jeux_carte[14];
    main_joueur2[4] = jeux_carte[15];
    main_joueur3[3] = jeux_carte[16];
    main_joueur3[4] = jeux_carte[17];
    main_joueur4[3] = jeux_carte[18];
    main_joueur4[4] = jeux_carte[19];
    main_joueur1[5] = jeux_carte[20];
    main_joueur1[6] = jeux_carte[21];
    main_joueur1[7] = jeux_carte[22];
    main_joueur2[5] = jeux_carte[23];
    main_joueur2[6] = jeux_carte[24];
    main_joueur2[7] = jeux_carte[25];
    main_joueur3[5] = jeux_carte[26];
    main_joueur3[6] = jeux_carte[27];
    main_joueur3[7] = jeux_carte[28];
    main_joueur4[5] = jeux_carte[29];
    main_joueur4[6] = jeux_carte[30];
    main_joueur4[7] = jeux_carte[31];
}


void caPremiere_Distribution(Carte jeux_carte[32], Carte* main_joueur1,
                              Carte* main_joueur2, Carte* main_joueur3, Carte* main_joueur4)
{

    int i;
    int r;
    srand(time(0));
    r = (rand()%(999999-1) +1);


    caDistribution (jeux_carte, main_joueur1, main_joueur2, main_joueur3 ,main_joueur4);
    while (r!=0)
    {
        for(i=0;i<8;i++)
        {
            jeux_carte[i]=main_joueur3[i];
            jeux_carte[i+8]=main_joueur1[i];
            jeux_carte[i+16]=main_joueur4[i];
            jeux_carte[i+24]=main_joueur2[i];
        }
        caDistribution (jeux_carte, main_joueur1, main_joueur2, main_joueur3 ,main_joueur4);
        r--;
    }
}


void caCoupe(Carte* jeux)
{
    int r,i,j;
    Carte jeux_carte[32];

    srand(time(0));
    r = (rand()%(30-1) +1);


    j=0;



    for(i=r;i<32;i++)
    {
        jeux_carte[j]=jeux[i];
        j++;
    }
    for(i=0;i<r;i++)
    {
        jeux_carte[j]=jeux[i];
        j++;
    }
    for(i=0;i<32;i++)
    {
        jeux[i]=jeux_carte[i];
    }


}

void caRedonne(Carte* main_joueur1, Carte* main_joueur2, Carte* main_joueur3, Carte* main_joueur4)
{
    int i;
    Carte jeux_carte[32];

        for(i=0;i<8;i++)
        {
            jeux_carte[i]=main_joueur1[i];
        }
        for(i=0;i<8;i++)
        {
            jeux_carte[i+8]=main_joueur2[i];
        }
        for(i=0;i<8;i++)
        {
            jeux_carte[i+16]=main_joueur3[i];
        }
        for(i=0;i<8;i++)
        {
            jeux_carte[i+24]=main_joueur4[i];
        }

    caCoupe(jeux_carte);

    caDistribution (jeux_carte, main_joueur1, main_joueur2, main_joueur3 ,main_joueur4);
}

void caTri_Main(Carte* main)
{
    Carte tmp,tmp2;

    Carte coeur[8];
    Carte carreau[8];
    Carte pique[8];
    Carte trefle[8];

    int i;
    int j;
    int somme=0;

    for(i=0;i<8;i++)
    {
            tmp=main[i];

            if(tmp.couleur == 'h')
            {
                j=0;

                while (coeur[j].couleur != 'h')
                {
                    if(tmp.nb_points <= coeur[j].nb_points)
                    {
                        j++;
                    }
                    else
                    {
                        tmp2=coeur[j];
                        coeur[j]=tmp;
                        tmp=tmp2;
                    }
                }
                if(tmp.nb_points == 0)
                {
                    if(tmp.valeur == '7')
                    {
                        coeur[j]=tmp;
                    }
                    else if(tmp.valeur == '8')
                    {
                        if(coeur[j-1].valeur == '7')
                        {
                            coeur[j]=coeur[j-1];
                            coeur[j-1]=tmp;
                        }
                        else
                        {
                            coeur[j]=tmp;
                        }
                    }
                    else if(tmp.valeur == '9')
                    {
                        if(coeur[j-1].valeur == '7')
                        {
                            if(coeur[j-2].valeur == '8')
                            {
                                coeur[j]=coeur[j-1];
                                coeur[j-1]=coeur[j-2];
                                coeur[j-2]=tmp;
                            }
                            else
                            {
                                coeur[j]=coeur[j-1];
                                coeur[j-1]=tmp;
                            }
                        }
                        else if (coeur[j-1].valeur =='8')
                        {
                            coeur[j]=coeur[j-1];
                            coeur[j-1]=tmp;
                        }
                        else
                        {
                            coeur[j]=tmp;
                        }
                    }
                }
                else
                {
                    coeur[j]=tmp;
                }
            }
            else if(tmp.couleur == 'p')
            {
                j=0;

                while (pique[j].couleur != 'p')
                {
                    if(tmp.nb_points <= pique[j].nb_points)
                    {
                        j++;
                    }
                    else
                    {
                        tmp2=pique[j];
                        pique[j]=tmp;
                        tmp=tmp2;
                    }
                }
                if(tmp.nb_points == 0)
                {
                    if(tmp.valeur == '7')
                    {
                        pique[j]=tmp;
                    }
                    else if(tmp.valeur == '8')
                    {
                        if(pique[j-1].valeur == '7')
                        {
                            pique[j]=pique[j-1];
                            pique[j-1]=tmp;
                        }
                        else
                        {
                            pique[j]=tmp;
                        }
                    }
                    else if(tmp.valeur == '9')
                    {
                        if(pique[j-1].valeur == '7')
                        {
                            if(pique[j-2].valeur == '8')
                            {
                                pique[j]=pique[j-1];
                                pique[j-1]=pique[j-2];
                                pique[j-2]=tmp;
                            }
                            else
                            {
                                pique[j]=pique[j-1];
                                pique[j-1]=tmp;
                            }
                        }
                        else if (pique[j-1].valeur =='8')
                        {
                            pique[j]=pique[j-1];
                            pique[j-1]=tmp;
                        }
                        else
                        {
                            pique[j]=tmp;
                        }
                    }
                }
                else
                {
                    pique[j]=tmp;
                }
            }
            else if(tmp.couleur == 'c')
            {
                j=0;

                while (carreau[j].couleur != 'c')
                {
                    if(tmp.nb_points <= carreau[j].nb_points)
                    {
                        j++;
                    }
                    else
                    {
                        tmp2=carreau[j];
                        carreau[j]=tmp;
                        tmp=tmp2;
                    }
                }
                if(tmp.nb_points == 0)
                {
                    if(tmp.valeur == '7')
                    {
                        carreau[j]=tmp;
                    }
                    else if(tmp.valeur == '8')
                    {
                        if(carreau[j-1].valeur == '7')
                        {
                            carreau[j]=carreau[j-1];
                            carreau[j-1]=tmp;
                        }
                        else
                        {
                            carreau[j]=tmp;
                        }
                    }
                    else if(tmp.valeur == '9')
                    {
                        if(carreau[j-1].valeur == '7')
                        {
                            if(carreau[j-2].valeur == '8')
                            {
                                carreau[j]=carreau[j-1];
                                carreau[j-1]=carreau[j-2];
                                carreau[j-2]=tmp;
                            }
                            else
                            {
                                carreau[j]=carreau[j-1];
                                carreau[j-1]=tmp;
                            }
                        }
                        else if (carreau[j-1].valeur =='8')
                        {
                            carreau[j]=carreau[j-1];
                            carreau[j-1]=tmp;
                        }
                        else
                        {
                            carreau[j]=tmp;
                        }
                    }
                }
                else
                {
                    carreau[j]=tmp;
                }
            }
            else if(tmp.couleur == 't')
            {
                j=0;

                while (trefle[j].couleur != 't')
                {
                    if(tmp.nb_points <= trefle[j].nb_points)
                    {
                        j++;
                    }
                    else
                    {
                        tmp2=trefle[j];
                        trefle[j]=tmp;
                        tmp=tmp2;
                    }
                }
                if(tmp.nb_points == 0)
                {
                    if(tmp.valeur == '7')
                    {
                        trefle[j]=tmp;
                    }
                    else if(tmp.valeur == '8')
                    {
                        if(trefle[j-1].valeur == '7')
                        {
                            trefle[j]=trefle[j-1];
                            trefle[j-1]=tmp;
                        }
                        else
                        {
                            trefle[j]=tmp;
                        }
                    }
                    else if(tmp.valeur == '9')
                    {
                        if(trefle[j-1].valeur == '7')
                        {
                            if(trefle[j-2].valeur == '8')
                            {
                                trefle[j]=trefle[j-1];
                                trefle[j-1]=trefle[j-2];
                                trefle[j-2]=tmp;
                            }
                            else
                            {
                                trefle[j]=trefle[j-1];
                                trefle[j-1]=tmp;
                            }
                        }
                        else if (trefle[j-1].valeur =='8')
                        {
                            trefle[j]=trefle[j-1];
                            trefle[j-1]=tmp;
                        }
                        else
                        {
                            trefle[j]=tmp;
                        }
                    }
                }
                else
                {
                    trefle[j]=tmp;
                }
            }
    }


    j=0;

    while (coeur[j].couleur != 'h')
    {
        main[j]=coeur[j];
        j++;
    }
    somme=j;
    j=0;
    while(pique[j].couleur != 'p')
    {
        main[j+somme]=pique[j];
        j++;
    }
    somme=somme+j;
    j=0;
    while(carreau[j].couleur != 'c')
    {
        main[j+somme]=carreau[j];
        j++;
    }
    somme=somme+j;
    j=0;
    while(trefle[j].couleur != 't')
    {
        main[j+somme]=trefle[j];
        j++;
    }

}


void caAtout(Carte* tab_carte,char couleur)
{
    int i=0;
    char valeur;

    for(i=0;i<8;i++)
    {
        if(tab_carte[i].couleur == couleur)
        {
            tab_carte[i].atout = 1;
            valeur = tab_carte[i].valeur;

                switch (valeur)
                {

                    case 57:
                        tab_carte[i].nb_points = 14;
                        break;
                    case 118:
                        tab_carte[i].nb_points = 20;
                        break;
                    default:
                        break;
                }

        }
        else
        {
                tab_carte[i].atout = 0;
                valeur = tab_carte[i].valeur;

                switch (valeur)
                {

                    case 57:
                        tab_carte[i].nb_points = 0;
                        break;
                    case 118:
                        tab_carte[i].nb_points = 2;
                        break;
                    default:
                        break;
                }


        }
    }
}

void caTri(Carte* main)
{
    Carte tmp;

    int i=0;
    int j=0;

    tmp = main[j];

    for(i=0;i<8;i++)
    {
        j=0;
        while(j != i)
        {
            if(main[i].numero < main[j].numero)
            {
                tmp = main[j];
                main[j]=main[i];
                main[i] = tmp;
            }
            else
            {
                j++;
            }
        }

    }

}
